module storage.attached { export class LocalStorageStorage implements AttachedStorage { constructor(private _localStorage: typeof localStorage) { getKeys(lead: string, obj: any, callback: (error: Error) => void) { for (var i = 0; i < this._localStorage.length; i++) { var key = this._localStorage.key(i);
if (key.length < lead.length) continue;
if (key.slice(0, lead.length) !== lead) continue;
populate(obj: any, callback: (error: Error) => void) { for (var k in obj) if (obj.hasOwnProperty(k)) { obj[k] = this._localStorage.getItem(k);
update(obj: any, callback: (error: Error) => void) { for (var k in obj) if (obj.hasOwnProperty(k)) { this._localStorage.removeItem(k);
this._localStorage.setItem(k, value);
export module LocalStorageStorage { export function detect(callback: (error: Error, storage: AttachedStorage) => void, windowOverride = window) { var localStorage = windowOverride.localStorage;
callback(new Error('Browser does not expose localStorage.'), null); var absentFunctions: string[] = [];
if (!localStorage.getItem) absentFunctions.push('getItem'); if (!localStorage.setItem) absentFunctions.push('setItem'); if (!localStorage.removeItem) absentFunctions.push('removeItem'); if (absentFunctions.length) { callback(new Error('Incorrect shape of localStorage (' + absentFunctions.join(', ') + ' ' + (absentFunctions.length == 1 ? 'is' : 'are') + ' absent).'), null); var storage = new LocalStorageStorage(localStorage);